home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / taropyon / hewin / ccisrc / mktags.cci < prev    next >
Text File  |  1993-11-30  |  5KB  |  211 lines

  1. /*************************************************************************
  2. *    "mktags.cci"  : 関数の定義位置を見つけ出す
  3. *************************************************************************/
  4.  
  5. char    _mktags_mode;
  6. char    *_mktags_fp;
  7.  
  8. #define    _MKTAGS_MODE    _mktags_mode
  9. #define    _MKTAGS_FP        _mktags_fp
  10.  
  11. #define    _MKTAGS_PTN        "^[A-Za-z_].*[ \\t]*[\\*A-Za-z_].*(.*)\\|^#[ \\t]*define[ \\t]*[A-Za-z_].*(.*)"
  12.  
  13. /*    ファイル出力    */
  14. int        _mktags_main_file(char *fn)
  15. {
  16.     char        *fp;
  17.     char        buf[512], tmp[128];
  18.     int            ret, pos, len, ln, ch, ec;
  19.     char        *reptn;
  20.  
  21.     sprintf( tmp,"---------- %s ----------\r\n", fn );
  22.     if ( (reptn = RePtnAlloc(_MKTAGS_PTN,0)) == NULL )
  23.         return (ERR);
  24.     DCN_puts( DCNPTR, tmp );
  25.     fputs( tmp, _MKTAGS_FP );
  26.     if ( (fp = FM_fopen(fn,"rb")) == NULL )
  27.     {    RePtnFree( reptn );
  28.         return (ERR);
  29.     }
  30.     ret = 0;
  31.     ln = 0;
  32.     while ( fgets(buf,512,fp) != NULL )
  33.     {
  34.         ++ln;
  35.         if ( RePtnMatch2( reptn, buf, &pos, &len) > 0 && pos == 0 )
  36.         {    /* match */
  37.             sprintf( tmp, "%-14s %d: ", fn, ln );
  38.             fputs( tmp, _MKTAGS_FP);
  39.             fputs( buf, _MKTAGS_FP);
  40.         }
  41.         if ( getkey(&ec) == '\x1B' || (ec&0xFF14) == KA_CANCEL )
  42.         {    DCN_puts( DCNPTR, "<<<BREAK>>>\r\n" );
  43.             ret = 1;
  44.             break;
  45.         }
  46.     }
  47.     FM_fclose(fp);
  48.     RePtnFree( reptn );
  49.     return (ret);
  50. }
  51.  
  52. /*    画面表示    */
  53. int        _mktags_main_scn(char *fn)
  54. {
  55.     char        *fp;
  56.     char        buf[512], tmp[128];
  57.     int            ret, pos, len, ln, ch, ec;
  58.     char        *reptn;
  59.  
  60.     sprintf( tmp,"---------- %s ----------\r\n", fn );
  61.     if ( (reptn = RePtnAlloc(_MKTAGS_PTN,0)) == NULL )
  62.         return (ERR);
  63.     DCN_puts(DCNPTR,tmp);
  64.     if ( (fp = FM_fopen(fn,"rb")) == NULL )
  65.     {    RePtnFree( reptn );
  66.         return (ERR);
  67.     }
  68.     ret = 0;
  69.     ln = 0;
  70.     while ( fgets(buf,512,fp) != NULL )
  71.     {    ++ln;
  72.         if ( RePtnMatch2( reptn, buf, &pos, &len) > 0 && pos == 0 )
  73.         {    /* match */
  74.             sprintf( tmp, "%-14s %d: ", fn, ln );
  75.             DCN_puts(DCNPTR, tmp);
  76.             DCN_puts(DCNPTR, buf);
  77.         }
  78.         if ( getkey(&ec) == '\x1B' || (ec&0xFF14) == KA_CANCEL )
  79.         {    DCN_puts(DCNPTR, "<<<BREAK>>>\r\n");
  80.             ret = 1;
  81.             break;
  82.         }
  83.     }
  84.     FM_fclose(fp);
  85.     RePtnFree( reptn );
  86.  
  87.     return (ret);
  88. }
  89.  
  90. int        _mktags_extract( char *wild )
  91. {
  92.     char    buf[64];
  93.     int        ret, cnt;
  94.  
  95. #if    0
  96.     sprintf( buf, "[wild:%s]\r\n", wild );
  97.     DCN_puts(DCNPTR, buf);
  98. #endif
  99.  
  100.     cnt = 0;
  101.     ret = FM_findfirst( wild, 0, buf );
  102.     while ( ret == 0 )
  103.     {
  104.         ++cnt;
  105. #ifdef    _TAROPYON_SYSTEM
  106.         if ( FS_cmpfnam( buf, "newhewin.cci")  )
  107.         {    /* "newhewin.cci" は処理しない    */
  108. #endif
  109.             if ( _MKTAGS_MODE )
  110.                 ret = _mktags_main_file( buf );
  111.             else
  112.                 ret = _mktags_main_scn( buf );
  113. #ifdef    _TAROPYON_SYSTEM
  114.         }
  115. #endif
  116.         if ( ret > 0 )
  117.             break;    /* 中断    */
  118.         ret = FM_findnext( buf );
  119.     }
  120.     return (cnt > 0 ? NORMAL : ERR);
  121. }
  122.  
  123. int        MkTags( int argc, char **argv)
  124. {
  125.     int        i;
  126.     char    *s;
  127.  
  128.     if ( _MKTAGS_MODE )
  129.     {    if ( (_MKTAGS_FP = FM_fopen("tags","wb")) == NULL )
  130.             return (ERR);
  131.     }
  132.     for ( i = 1; i < argc; ++i )
  133.     {    s = argv[i];
  134.         if ( *s == '-' || *s == '/' )
  135.         {    /* option */
  136.         } else
  137.         {    _mktags_extract( s );
  138.         }
  139.     }
  140.     if ( _MKTAGS_MODE )
  141.         FM_fclose(_MKTAGS_FP);
  142.     return (NORMAL);
  143. }
  144.  
  145. /*************************************************************************
  146. *    関数定義位置を表示する
  147. *************************************************************************/
  148.  
  149. int        _dcn_searchFunction( char *dcn )
  150. {
  151.     int        i, ret;
  152.     int        argc;
  153.     char    **argv;
  154.     char    *para;
  155.  
  156.     ret = MNU_sure ( DLGPOS_CENTER_OF_SCN, DLGPOS_CENTER_OF_SCN, 
  157.         C_MBLACK, C_DLGBASE, COLMIX(C_INFO,C_GRAY), SELBTN_ATT_LEFT,
  158. "   カレントディレクトリの 拡張子 .H .C .CCI ファイルから、  \n  関数定義,マクロ定義位置を探します。"
  159.     );
  160.     if ( ret != MENU_SURE_OK )
  161.         return (ERR);
  162.  
  163.     _MKTAGS_MODE = 0;
  164.     DCNPTR = dcn;
  165.     DCN_puts(DCNPTR,"\r\n");
  166.  
  167.     para = "mktags *.h *.c *.cci";
  168.     argc = FS_argSet(para,&argv);
  169.     if ( argc > 0 )
  170.     {    MkTags( argc, argv );
  171.         FS_argClear( argc, argv );
  172.     }
  173.     return    (DCNCMD_PROMPT);
  174. }
  175.  
  176.  
  177. /*************************************************************************
  178. *    "tags" ファイルを作成
  179. *************************************************************************/
  180.  
  181. int        _dcn_mktags( char *dcn )
  182. {
  183.     int        i, ret;
  184.     int        argc;
  185.     char    **argv;
  186.     char    *para;
  187.  
  188.     ret = MNU_sure ( DLGPOS_CENTER_OF_SCN, DLGPOS_CENTER_OF_SCN, 
  189.         C_MBLACK, C_DLGBASE, COLMIX(C_INFO,C_GRAY), SELBTN_ATT_LEFT,
  190. "   カレントディレクトリの 拡張子 .H .C .CCI ファイルから、  \n  \x22tags\x22ファイルを作成します。"
  191.     );
  192.     if ( ret != MENU_SURE_OK )
  193.         return (ERR);
  194.  
  195.     _MKTAGS_MODE = 1;
  196.     DCNPTR = dcn;
  197.     DCN_puts(DCNPTR,"\r\n");
  198.  
  199.     para = "mktags *.h *.c *.cci";
  200.     argc = FS_argSet(para,&argv);
  201.     if ( argc > 0 )
  202.     {    MkTags( argc, argv );
  203.         FS_argClear( argc, argv );
  204.     }
  205.     return    (DCNCMD_PROMPT);
  206. }
  207.  
  208. #undef    _MKTAGS_MODE
  209. #undef    _MKTAGS_FP
  210. #undef    _MKTAGS_PTN
  211.